Yeni: Yapay zekâ güvenlik duvarı tüm platformu izliyor ve her olayı sade bir dille açıklıyor. Nasıl çalıştığını görün

Aoife Lynch

lynchlab

@aoife_l22 · Nisan 2025 tarihinde katıldı

Yeni üye

Engineering student · university

Konular
15
Yanıtlar
79
Puan
0
Yeni üye10 için Üye puan

Oluşturulan forum yanıtları

15 yazı görüntüleniyor – 46 ile 60 arası (toplam 79)

Pinning works to get the alarm back today. The proper fix is two lines. paho 2.x wants the callback API version as the first argument, and your script passes the client id there, so “chiller-pi” gets read as an API version. Change the constructor and the on_connect signature:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, reason_code, properties):
    print("connected:", reason_code)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="chiller-pi")
client.on_connect = on_connect
client.username_pw_set("<ACCESS_TOKEN>")      # token as username, empty password
client.tls_set()
client.connect("<device host>", 8883, keepalive=60)
client.loop_start()
...
client.publish("v1/telemetry", json.dumps({"chiller_temp_c": t}), qos=1)

Don’t switch the protocol to MQTT 5 while you’re in there. Hermetry speaks 3.1.1 and refuses an MQTT 5 CONNECT with return code 1. paho still defaults to 3.1.1, so leaving it alone is right.

If the tech had other callbacks (on_disconnect, on_publish), they changed signature in 2.x as well, check the migration notes for each one.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 7

Yapay zekâ tarafından English dilinden çevrildi ·

Wemos yeniden başlatıldığında çalışan toplam ne olacak? Temizlikçiler fişi çektiğinde elektrik kesintisi olur, bahse girerim.

Timestamps in UTC or it didn't happen.
♥ 2

Then the 2 registers are one 32-bit float. Splitting your reply:

01          slave address
03          function (read holding registers)
04          byte count, 4 bytes follow
43 66 99 9A data: register 0 = 0x4366, register 1 = 0x999A
3A 1E       CRC

Put the four data bytes together as 0x4366999A and read them as an IEEE 754 float: sign 0, exponent gives 2^7 = 128, mantissa about 1.8016, and 128 x 1.8016 = 230.6. So Wilson’s 0x4366 is the first half of the float, which is why dividing never comes out right.

On the Uno the bytes arrive most significant first but the AVR is little endian, so reverse them before copying into a float:

uint8_t b[4] = { rx[6], rx[5], rx[4], rx[3] };   // 9A 99 66 43
float v;
memcpy(&v, b, 4);
Serial.print("{"l1.voltage":");
Serial.print(v, 1);
Serial.println("}");

Some meters send the two registers the other way round (word swapped). If you ever get something like 1.2e-23 instead of a voltage, swap rx[3..4] with rx[5..6]. Check the CRC before trusting a reply too.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 6

It’s the timing around DE, I had the exact same thing on a lab rig with an F103.

HAL_UART_Transmit returns when the last byte has gone into the data register, not when it has left the shift register. Then you wait 5 ms on top. At 9600 one byte is about 1 ms, and a fast meter starts answering within a few ms. While DE is high, /RE is high too, so the receiver is off and the first bytes of the reply are gone. And because HAL_UART_Receive is only called after that, anything that came in meanwhile is lost or sits half in the data register.

The echo comes from the other order: if the receive is already armed while you transmit and /RE is low for a moment, you read back your own request.

Drop DE the moment the transmit complete flag (TC) is set, and arm the receive right after:

__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
HAL_UART_Transmit(&huart2, req, 8, 100);
while (!__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC)) {}
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
__HAL_UART_FLUSH_DRREGISTER(&huart2);
HAL_UART_Receive(&huart2, rx, 9, 200);

Better still, use interrupt or DMA receive with the idle line interrupt, then a 3.5 character gap ends the frame and you don’t need to know the length in advance. The F103 has no hardware DE pin for RS-485, newer families do, which saves all of this.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 3

Went with 100 m of Cat6 on a reel for video and driving, and 868 MHz point-to-point LoRa for telemetry and the e-stop. The base laptop forwards to Hermetry. Pulled the tether out in a test on purpose and the e-stop still worked over LoRa. Judges liked the gas chart.

Timestamps in UTC or it didn't happen.
♥ 2

Kevin is closer. Bluetooth 4.0 is the version of the spec that introduced Low Energy, so “BLE” is part of 4.0 and every version after it. A “Bluetooth 4.0” device can be classic Bluetooth, BLE, or both. For battery sensors it’s almost always BLE in practice. Ask the first vendor to confirm in writing.

The bigger question is your second one. Hermetry takes data over MQTT, HTTPS or LoRaWAN, so neither sensor talks to it directly. You’d need a gateway near the motors that listens to the sensors and reports each one as a child device in Hermetry (one gateway login, each sensor shows up as its own device with its own history and alarms). That only works if the vendor documents what the sensor sends: the advertising format, or the BLE characteristics to read. If the data only ever goes into their phone app and they won’t tell you the format, it’s not getting into Hermetry, whatever version it is.

So the question to send both vendors: “Is the data format documented so a third-party BLE gateway can read it?”

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 1

Yapay zekâ tarafından English dilinden çevrildi ·

Birinci sınıfta aynı şeyi yaşadım, sonradan sensör çalıştı ama şanslıydım. Tam kontrol listesi:Bağlantı: kırmızı 3V3’e (pin 1), siyah GND’ye (pin 6), sarı GPIO4’e (pin 7) ve sarıdan 3V3’e 4.7k direnç. /boot/firmware/config.txt dosyasına (eski imajlarda /boot/config.txt) dtoverlay=w1-gpio ekleyin ve yeniden başlatın. 28-xxxxxxxxxxxx klasörünü görmeniz gerekir.Ardından, sahip olduğunuz paho koduyla birlikte betik:

import glob, json, time
import paho.mqtt.client as mqtt

dev = glob.glob('/sys/bus/w1/devices/28-*/w1_slave')[0]
def read_c():
    lines = open(dev).read().splitlines()
    if not lines[0].endswith('YES'):
        return None                      # CRC failed, skip this one
    return int(lines[1].split('t=')[1]) / 1000.0

c = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="basement-pi")
c.username_pw_set("YOUR_ACCESS_TOKEN")    # token as username, no password
c.tls_set()
c.connect("YOUR_BROKER_HOST", 8883, keepalive=60)
c.loop_start()
while True:
    t = read_c()
    if t is not None:
        c.publish("v1/telemetry", json.dumps({"temp_c": round(t, 2)}), qos=1)
    time.sleep(60)

CPU okumalarının aynı grafikte karışmaması için temp_c gibi yeni bir anahtar adı kullanın. Broker adresi cihazın Connection details kartında yer alıyor.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 8

IPAddress has fromString(), so no splitting needed:

IPAddress ip;
if (ip.fromString(brokerStr)) {
  client.setServer(ip, 1883);
}

But Ciaran’s point: for Hermetry you don’t want an IP at all. Its broker is TLS on 8883 and needs SNI, so you must connect by host name. setServer() has a version that takes a host name, which works for your Pi too if you type its name or IP as text:

char brokerHost[64];   // global, lives as long as the program

void applyConfig(const String &s) {
  s.toCharArray(brokerHost, sizeof(brokerHost));
  client.setServer(brokerHost, 8883);
}

The global buffer is the important bit. PubSubClient keeps the pointer you pass, it doesn’t copy the text. If you pass brokerStr.c_str() from a String that goes out of scope at the end of setup(), the pointer dangles and it’ll try to connect to garbage later. I lost an afternoon to that in my final year project, the board connected on first boot and then never again after a reconnect.

Make the parameter long enough for the Hermetry host on your device’s Connection details card, 64 characters is plenty.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 5

Yapay zekâ tarafından English dilinden çevrildi ·

“cmd” SMBus adlandırmasıdır. Bir SMBus blok yazmada adresten sonraki ilk bayta komut baytı denir ve ADS1115 gibi register tabanlı çiplerde bu bayt register işaretçisidir. Yani ilk satırınız işaretçiyi Config registerına (0x01) yönlendirir ve buraya 0xC3, ardından 0x83 yazar. Hatta: start, 0x90, 0x01, 0xC3, 0x83, stop.0xC383 şu anlama gelir: tek bir dönüşüm başlat, AIN0’ı GND’ye karşı ölç, ±4.096 V aralığı, tek atımlı mod, 128 örnek/s. Okuma işlemi işaretçiyi 0x00 (Conversion registerı) olarak ayarlar ve iki bayt okur.Hatanız bayt sırasındadır. ADS1115 önce en anlamlı baytı gönderir ve sonuç işaretlidir:

data = bus.read_i2c_block_data(0x48, 0x00, 2)
raw = (data[0] << 8) | data[1]
if raw > 0x7FFF:
    raw -= 0x10000
volts = raw * 4.096 / 32768

Baytlar ters olduğunda, düşük bayttaki küçük bir değişim büyük bir sıçramaya dönüşür; bu da sizin 900 ile 52.000 farkınızdır. AIN1 için MUX bitlerini değiştirin: [0xD3, 0x83]. 128 SPS’de 10 ms yeterlidir (bir dönüşüm yaklaşık 8 ms sürer), dolayısıyla bekleme süresi uygundur.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 7

I did a tracker board for my RF module last year and got the same “slow fix, half range” result on rev A, so this is mostly what my lecturer took apart on it.

Keep the top pour, but make it a real ground: connected to the layer 2 plane with stitching vias everywhere, especially along every RF trace and around each RF section. Space them about 3 to 5 mm apart, tighter near the RF parts. A pour with a few random vias is a floating patch that resonates, and that alone can cost you sensitivity.

Do not split the ground. Isolate the sections by placement (each radio in its own corner, the noisy LTE power stuff away from GNSS) and, if needed, by a stitched fence of vias, but keep one continuous plane underneath.

Under and around the chip antenna and the patch: follow each antenna’s datasheet keep-out exactly. No copper on any layer in the chip antenna’s keep-out, and the patch wants its specified ground area under it. Michael is right too: give the two antennas different edges and ideally opposite corners.

Run your RF traces as grounded coplanar waveguide at 50 ohms (calculate with your stack-up, the vias on both sides are part of it) and leave a pi-network footprint at each antenna feed so you can tune later.

Then measure: send the LoRa RSSI and SNR and the GNSS satellite count and time to fix as readings with every message, and compare rev A against rev B on one chart. That’s the easiest A/B test you’ll get.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 9

Yapay zekâ tarafından English dilinden çevrildi ·

Ve 12 priz için, bunları ağ geçidi tarafında da toplu olarak gönderin. Tek bir v1/gw/telemetry mesajı, hepsini çocuk adına göre anahtarlanmış şekilde taşıyabilir.

Timestamps in UTC or it didn't happen.
♥ 1

Yapay zekâ tarafından English dilinden çevrildi ·

Evet. O blog, kendi ev ağınızdaki bir broker için hazırlanmış, bu yüzden 192.168 adresi var. Hermetry için hiç IP kullanmanız gerekmiyor: Connection details kartındaki host adıyla, 8883 portunda TLS üzerinden bağlanın. TLS ad bilgisini (SNI) gerektirir, bu yüzden ping attığınız IP başarısız olur; düz 1883 ise profil düz MQTT’ye izin vermediği sürece reddedilir, varsayılan olarak da izin vermez. rc=5 “not authorised” (yetkisiz) anlamına gelir; asıl neden cihazın Log sekmesinde yer alıyor, bir bakmaya değer.

import ssl, json, paho.mqtt.client as mqtt

HOST = "<host from Connection details>"
TOKEN = "<access token>"

c = mqtt.Client(client_id="reefer-01")
c.username_pw_set(TOKEN)                  # token as username, no password
c.tls_set(cert_reqs=ssl.CERT_REQUIRED)    # normal public CA bundle
c.connect(HOST, 8883, keepalive=60)
c.loop_start()
c.publish("v1/telemetry", json.dumps({"temperature": -18.2}), qos=1)

paho 2.x ile bunun yerine mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="reefer-01") kullanmanız gerekir.

Timestamps in UTC or it didn't happen.
Kabul edilen çözüm♥ 2

Yapay zekâ tarafından English dilinden çevrildi ·

Bu işe yaradı, 12’si de çalışıyor. Hemen device_exists hatasıyla karşılaştım çünkü hata ayıklama sırasında 3 numaralı düğümün flash belleğini silmiştim; düğüm zaten aq-3c84a1 olarak kaydolmuştu. Konsoldan o cihazı sildim ve yeniden provizyon edildi, sorunsuz çalıştı. Bu sabah hepsini karantinadan etkinleştirdim. Ayrıca tırnak işaretlerini doğru şekilde kaçışlamam gerekti; ilk sürümüm bozuk JSON gönderiyordu ve hiçbir yanıt alamıyordum.

Timestamps in UTC or it didn't happen.
♥ 0

Yapay zekâ tarafından English dilinden çevrildi ·

PlatformIO’da Arduino core 2.0.14. Wi-Fi kısmı için WiFiManager kullanmaya devam etmekten memnuniyet duyarım; takıldığım nokta ise Hermetry token’ı. Mümkünse konsolu açıp 12 cihaz oluşturmak ve 12 token’ı 12 portala kopyalamak istemiyorum.

Timestamps in UTC or it didn't happen.
♥ 0

Yapay zekâ tarafından English dilinden çevrildi ·

Sorun buymuş, printer projesinden kalan disable-bt satırı. Utanç verici. Satır yorum satırı yapıldı, hciuart etkinleştirildi, hci0 geri geldi ve altı etiketin tamamı taramada görünüyor. Artık Hermetry içinde alt öğeler olarak görünüyorlar.

Timestamps in UTC or it didn't happen.
♥ 0
15 yazı görüntüleniyor – 46 ile 60 arası (toplam 79)