| Użytkownicy online |
Aktualnie jest 68 użytkowników online. » 0 Użytkownik(ów) | 64 Gość(i) Baidu, Bing, Google, Yandex
|
| Ostatnie wątki |
The Strange Comfort of Re...
Forum: LanKontroler V4
Ostatni post: Carrero436
06-13-2026, 07:44 AM
» Odpowiedzi: 0
» Wyświetleń: 100
|
Lk 3.8
Forum: LanKontroler V3.5
Ostatni post: stAch
06-12-2026, 08:28 PM
» Odpowiedzi: 1
» Wyświetleń: 1,413
|
Why Five Nights at Freddy...
Forum: Dokumentacje i wsady do TinyESP
Ostatni post: Trangalo235
06-12-2026, 07:19 AM
» Odpowiedzi: 0
» Wyświetleń: 91
|
Is repo Still Scary With ...
Forum: Dokumentacje i wsady do TinyESP
Ostatni post: Vally1349
06-12-2026, 04:31 AM
» Odpowiedzi: 0
» Wyświetleń: 66
|
Sofar ME3000SP Modbus
Forum: MODBUS Urzadzenia Custom
Ostatni post: AlicaDenison
06-04-2026, 07:43 AM
» Odpowiedzi: 7
» Wyświetleń: 11,550
|
Gdzie spędziliście ostatn...
Forum: LanKontroler V3
Ostatni post: Dioneya
06-01-2026, 03:24 PM
» Odpowiedzi: 2
» Wyświetleń: 273
|
Clash.gg Promotion Code 2...
Forum: LanKontroler - wersje oprogramowania
Ostatni post: Plover
05-28-2026, 04:39 PM
» Odpowiedzi: 0
» Wyświetleń: 222
|
Akumulator
Forum: Dokumentacje i wsady do TinyESP
Ostatni post: Wafello3
05-28-2026, 04:28 PM
» Odpowiedzi: 5
» Wyświetleń: 11,347
|
programik
Forum: Programy i Serwery
Ostatni post: Wafello3
05-28-2026, 04:26 PM
» Odpowiedzi: 5
» Wyświetleń: 14,366
|
Jak szybko tłumaczyć poje...
Forum: LanKontroler V3
Ostatni post: Wafello3
05-28-2026, 04:24 PM
» Odpowiedzi: 3
» Wyświetleń: 1,160
|
|
|
| Konwersja Modbus TCP na RTU, izolacja RS485, zakres VCC |
|
Napisane przez: marekm - 11-15-2025, 08:01 PM - Forum: LanKontroler V4
- Odpowiedzi (1)
|
 |
Czy byłaby możliwość dodania (chyba że już jest - w dokumentacji na pierwszy rzut oka nie widzę) do LK4 możliwości konwersji Modbus TCP na RTU? Dla dowolnych urządzeń, po prostu serwer TCP odbiera zapytanie i przekazuje je jako ramkę RTU na RS485, po czym przekazuje odpowiedź z powrotem (lub zwraca kod błędu jeśli brak odpowiedzi). Podobną funkcję ma np. MikroTik KNOT. LK4 sam też odpowiada na zapytania Modbus TCP, więc trzeba by mu dodać konfigurowalny Unit ID (jego własny na który ma odpowiadać zamiast przekazywać dalej jako RTU).
Przy okazji pytania, czy RS485 jest izolowany i do jakiego max napięcia? Oraz czy 58V to absolute max VCC - bo pasowałoby mi zasilać LK4 i jednocześnie mierzyć napięcie z magazynu energii (16S LFP), 16*3,65 = 58,4V to dopuszczalne maksimum, rzadko kiedy tyle będzie i powyżej 58V nie muszę mieć dokładnego pomiaru ale czy tak powiedzmy do 60V przez ograniczony czas wytrzyma i nie uleci "magiczny dym"? Szeregowo o zasilaniem oczywiście będzie bezpiecznik, czy wskazane byłoby dodać szeregowo diodę Zenera by zgubić kilka V (wtedy przydałoby się móc przesunąć pomiar VCC o tyle samo w górę, by poprawnie liczyć moc i energię)?
|
|
|
| Backup automat php |
|
Napisane przez: stAch - 07-28-2025, 01:00 PM - Forum: LanKontroler - wersje oprogramowania
- Brak odpowiedzi
|
 |
jeden klik i zapisane nawet 100 backupów z LK3 w różnych lokalizacjach - nic prostszego.
Kod PHP: <?php error_reporting(E_ALL); parse_str($_SERVER['QUERY_STRING']);
if (isset($_GET['cron'])) { $_POST['backups'] = 1; $_SERVER['REQUEST_METHOD'] = 'POST'; }
$folder = "backups"; $pattern = '/_(\d{4}-\d{2}-\d{2})_setting\.bin$/'; // Usuwanie plików (na podstawie daty z POST) if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['date'])) { $dateToDelete = $_POST['date']; foreach (scandir($folder) as $file) { if (preg_match($pattern, $file, $matches) && $matches[1] === $dateToDelete) { unlink($folder . DIRECTORY_SEPARATOR . $file); } } echo json_encode(['success' => true]); exit; } // Backup i lista if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['backups'])) { $messages = ""; // ? Dane logowania globalne $globalUser = 'admin'; $globalPass = 'xxxxxxx'; // ? Lista hostów $sources = [ ['ip' => '192.168.1.20', 'port' => 97, 'name' => 'SOL'], ['ip' => '192.168.1.20', 'port' => 98, 'name' => 'CWU', 'user' => 'admin', 'pass' => 'xxxxxx'], ['ip' => '192.168.1.20', 'port' => 99, 'name' => 'GSM'], ['ip' => '192.168.1.20', 'port' => 100, 'name' => 'PCO'], ]; $remotePath = "/lk3_settings.bin"; $backupDir = __DIR__ . '/backups'; if (!is_dir($backupDir)) { mkdir($backupDir, 0777, true); } $date = date("_Y-m-d"); foreach ($sources as $source) { $ip = $source['ip']; $port = $source['port']; $name = $source['name']; $user = $source['user'] ?? $globalUser; $pass = $source['pass'] ?? $globalPass; $url = "http://$ip:$port$remotePath"; $auth = base64_encode("$user:$pass"); $opts = [ "http" => [ "method" => "GET", "header" => "Authorization: Basic $auth\r\n" ] ]; $context = stream_context_create($opts); $content = @file_get_contents($url, false, $context); if ($content === false) { $messages .= "<div>? Błąd pobierania: $url</div>"; continue; } $filename = "{$name}{$date}_setting.bin"; $filepath = $backupDir . '/' . $filename; if (file_put_contents($filepath, $content) !== false) { $messages .= "<div>✔ Zapisano: $filename</div>"; } else { $messages .= "<div>? Błąd zapisu: $filename</div>"; } } // ? Lista backupów ob_start(); $groups = []; foreach (scandir($folder) as $file) { if (preg_match($pattern, $file, $matches)) { $date = $matches[1]; $groups[$date][] = $file; } } if (empty($groups)) { echo "<p>Brak plików.</p>"; } else { foreach ($groups as $date => $files) { echo "<div class='group' data-date='" . htmlspecialchars($date) . "'>"; echo "<button class='delete-btn' onclick='deleteGroup(\"$date\")'>Usuń grupę</button>"; echo "<h3>" . htmlspecialchars($date) . "</h3>"; foreach ($files as $file) { $fileEnc = rawurlencode($file); echo "<div class='file'>"; echo htmlspecialchars($file); echo " <a class='download' href='backups/$fileEnc' download>Pobierz</a>"; echo "</div>"; } echo "</div>"; } } $html = ob_get_clean(); echo json_encode([ 'success' => true, 'html' => $html, 'messages' => $messages ]); exit; } // Pierwsze wczytanie listy $groups = []; foreach (scandir($folder) as $file) { if (preg_match($pattern, $file, $matches)) { $date = $matches[1]; $groups[$date][] = $file; } } ?> <!DOCTYPE html> <html lang="pl"> <head> <meta charset="UTF-8"> <title>LK3 Backups</title> <style> body { font-family: Arial; padding: 20px; } .group { border: 1px solid #ccc; padding: 10px; margin-bottom: 20px; border-radius: 5px; } .group h3 { margin: 0 0 10px 0; } .file { margin-left: 20px; } .delete-btn { background: #d00; color: white; border: none; padding: 5px 10px; float: right; cursor: pointer; } .download { background: #4CAF50; color: white; padding: 3px 8px; margin-left: 10px; text-decoration: none; border-radius: 3px; } .download:hover { background: #45a049; } .info { margin-top: 20px; padding: 10px; background: #f9f9f9; border: 1px dashed #aaa; white-space: pre-wrap; } button.refresh { background: #007bff; color: white; border: none; padding: 6px 12px; cursor: pointer; } </style> </head> <body> <h1>Kopie zapasowe LK3 wg. daty</h1> <div id="backup-list"> <?php if (empty($groups)): ?> <p>Brak plików.</p> <?php else: ?> <?php foreach ($groups as $date => $files): ?> <div class="group" data-date="<?= htmlspecialchars($date) ?>"> <button class="delete-btn" onclick="deleteGroup('<?= $date ?>')">Usuń grupę</button> <h3><?= htmlspecialchars($date) ?></h3> <?php foreach ($files as $file): ?> <div class="file"> <?= htmlspecialchars($file) ?> <a class="download" href="backups/<?= rawurlencode($file) ?>" download>Pobierz</a> </div> <?php endforeach; ?> </div> <?php endforeach; ?> <?php endif; ?> </div> <div class="info"> <button class="refresh" onclick="getBackups()">? Aktualizuj (pobierz backupy)</button> </div> <script> function deleteGroup(date) { if (!confirm(`Czy na pewno chcesz usunąć wszystkie pliki z datą ${date}?`)) return; fetch('', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'date=' + encodeURIComponent(date) }) .then(res => res.json()) .then(data => { if (data.success) { document.querySelector(`.group[data-date="${date}"]`).remove(); } else { alert('Błąd przy usuwaniu.'); } }); } function getBackups() { document.querySelector('.info').innerHTML = '⏳ Trwa pobieranie...'; fetch('', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: 'backups=1' }) .then(res => res.json()) .then(data => { if (data.success) { if (data.html) { document.querySelector('#backup-list').innerHTML = data.html; } if (data.messages) { document.querySelector('.info').innerHTML = data.messages; } else { document.querySelector('.info').innerHTML = '✅ Gotowe.'; } } else { document.querySelector('.info').innerHTML = '❌ Błąd przy pobieraniu.'; } }) .catch(err => { console.error('Fetch error:', err); document.querySelector('.info').innerHTML = '❌ Wystąpił błąd sieci.'; }); } </script> </body> </html>
zapisać na serwerze ...edytować ip i porty do pobrania plików backups oraz globalne hasło i usera czyli fragment kodu poniżej.
Kod: // ? Dane logowania globalne
$globalUser = 'admin'; //globalny user
$globalPass = 'pass'; //globalne haslo
// ? Lista hostów
$sources = [
['ip' => '192.168.1.100', 'port' => 80, 'name' => 'SOL'],
['ip' => '132.138.3.220', 'port' => 98, 'name' => 'CWU', 'user' => 'user', 'pass' => '1234'],
['ip' => '132.138.3.220', 'port' => 99, 'name' => 'GSM'],
['ip' => '132.138.3.220', 'port' => 100, 'name' => 'PCO'],
];
jeśli wszystkie maja takie samo to nie musicie go podawać dla każdego z osobna wystarczy je podać jako globalne
skrypt pobiera zarówno z lokal ip:80 jak i po external ip:port można dodać go do crona by sam cyklicznie robił kopie na serwerze.
Kod: 0 2 * * * curl -s "http://twojadomena.pl/backup.php?cron=1" > /dev/null 2>&1
pytania lub problemy chętnie p/odpowiem...
|
|
|
| mqtt brak banych po aktualizacji 1.24 |
|
Napisane przez: sl500 - 06-11-2025, 10:30 AM - Forum: LanKontroler V4
- Odpowiedzi (5)
|
 |
Po aktualizacji do wersji 1.24 połączenie z mqtt zgasło. Nie pomogła próba dodania nowego urządzenia na serwerze i ponowna konfiguracja po stronie lk. Po stronie lk cały czas jest: MQTT DISCONNECTED.
Wróciłem do wersji 1.18a
|
|
|
| Lk 3.8 |
|
Napisane przez: syky95 - 04-28-2025, 06:59 PM - Forum: LanKontroler V3.5
- Odpowiedzi (1)
|
 |
Hello, is there any way to factory reset the LK 3.8? After holding the reset button, nothing happens and the relay doesn't click like it used to. Thank you for any advice.
|
|
|
| Wirtualny OLED |
|
Napisane przez: krzychor - 04-26-2025, 08:21 AM - Forum: LanKontroler V3.5
- Brak odpowiedzi
|
 |
witam,
w funkcjonalności Wirtualny OLED nie działa "obcinacz" dla Power, Energy, Diff co powoduje że wartości sa wyświetlane z dużą ilością cyfr po przecinku
czy da się to jakoś ustawić?
sądzę że to błąd softu, czy twórcy mogli by to poprawić?
pozdrawiam
|
|
|
| tMPC-04 - Licznik impulsów |
|
Napisane przez: rpce - 04-25-2025, 03:13 PM - Forum: LanKontroler V3.5
- Brak odpowiedzi
|
 |
Czemu w liczniku nie zrobiono jak w tiny ESP podtrzymywania akumulatorkiem. Byłoby super a tak trzeba zawsze coś dłubać.
|
|
|
| MODBUS - niepoprawna obsługa |
|
Napisane przez: xerxes7 - 04-07-2025, 11:43 PM - Forum: LanKontroler V4
- Odpowiedzi (1)
|
 |
Witam,
Sekcje "Custom" w obsłudze MODBUS zawiera bład.
Próbując czytać R4DCB08 znalazłem problem polegający na nieprawidłowym odczycie temperatury z DS18B20.
Konfiguracja:
{"name":"8xDS_0x0C","bitrate":0,"parityBit":0,"stopBit":1,"delayBetweenReads":1,"readings":[{"index":1,"active":true,"name":"DS1","unit":"C","divisor":10,"address":0,"functionCode":3,"variableType":0,"endian":0},{"index":2,"active":true,"name":"DS2","unit":"C","divisor":10,"address":1,"functionCode":3,"variableType":0,"endian":0},{"index":3,"active":true,"name":"DS3","unit":"C","divisor":10,"address":2,"functionCode":3,"variableType":0,"endian":0},{"index":4,"active":true,"name":"DS4","unit":"C","divisor":10,"address":3,"functionCode":3,"variableType":0,"endian":0},{"index":5,"active":true,"name":"DS5","unit":"C","divisor":10,"address":4,"functionCode":3,"variableType":0,"endian":0},{"index":6,"active":true,"name":"DS6","unit":"C","divisor":10,"address":5,"functionCode":3,"variableType":0,"endian":0},{"index":7,"active":true,"name":"DS7","unit":"C","divisor":10,"address":6,"functionCode":3,"variableType":0,"endian":0},{"index":8,"active":true,"name":"DS8","unit":"C","divisor":10,"address":7,"functionCode":3,"variableType":0,"endian":0}]}
Pomimo dzielnika przez 10 LK4 czyta tylko całkowitą część z pomiaru:
Szczęśliwie nie ma już problemów z ujemnymi wartościami, które były problem w LK3.8 i powodem rezygnacji z użytkowania urządzenia.
Dlatego bardzo proszę o poprawę tego błędu albo zaprzestanie mówienia o możliwości konfigurowania "custom modules", bo wygląda to na naciąganie ludzi na wydatki.
Pozdrawiam, licząc na szybką korektę błędu.
J.J.
|
|
|
|